home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / src / demos / GL / newave / newave.c < prev    next >
C/C++ Source or Header  |  1994-08-01  |  25KB  |  1,195 lines

  1. /*
  2.  * Copyright 1991, 1992, 1993, 1994, Silicon Graphics, Inc.
  3.  * All Rights Reserved.
  4.  *
  5.  * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
  6.  * the contents of this file may not be disclosed to third parties, copied or
  7.  * duplicated in any form, in whole or in part, without the prior written
  8.  * permission of Silicon Graphics, Inc.
  9.  *
  10.  * RESTRICTED RIGHTS LEGEND:
  11.  * Use, duplication or disclosure by the Government is subject to restrictions
  12.  * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
  13.  * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
  14.  * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
  15.  * rights reserved under the Copyright Laws of the United States.
  16.  */
  17. #include <stdio.h>
  18. #include <gl.h>
  19. #include <math.h>
  20. #include <device.h>
  21.  
  22. #define PI 3.1415926536
  23. #define NRAMPB 832
  24. #define NRAMPE 1023
  25. #define DRAMPB 768
  26. #define DRAMPE 831
  27. #define CRAMPB 700
  28. #define CRAMPE 767
  29. #define SRAMP 1024
  30. #define MYRED 1536
  31. #define MYGREEN 1552
  32. #define MYCYAN 1568
  33.  
  34. #define X 0
  35. #define Y 1
  36. #define Z 2
  37.  
  38. #define GRID 21        /* largest possible grid size */
  39.  
  40. int grid = 17;
  41. float dt = 0.004;
  42.  
  43. Angle dtheta=0, dphi=0;
  44. Angle sphi=0, stheta=450;
  45. Coord sdepth;
  46.  
  47. float light[3],phi=PI/4.0,theta=PI/4.0;
  48. float dot();
  49. int getpolycolor(), getpolycolor2();
  50.  
  51. short dev,val;
  52. Boolean attached,smode=FALSE;
  53. Boolean spin;
  54. int x,y;
  55. short omx,omy,nmx,nmy;
  56.  
  57. float force[GRID][GRID],
  58.       veloc[GRID][GRID],
  59.       posit[GRID][GRID],
  60.       vertvec[GRID][GRID][3];
  61.  
  62. int   colur[GRID][GRID];
  63.  
  64. int menu, killmenu, display_menu, grid_menu, speed_menu;
  65.  
  66. int dmode=1;
  67. #define NORMAL 1
  68. #define DEPTHCUED 2
  69. #define FLAT_SHADED 3
  70. #define GOURAUD_SHADED 4
  71. #define TOPVIEW 5
  72.  
  73. int antialias=FALSE;
  74. int editing = FALSE;
  75.  
  76. Coord near=1.0, far=40.0, onear=1.0, ofar=40;
  77. float aspect = 5.0/4.0;
  78. short oldcolors[1024][3];
  79.  
  80. long xsize, ysize, xorig, yorig;
  81.  
  82. menukill() 
  83. {
  84.     int really;
  85.  
  86.     qreset();
  87.     really = dopup(killmenu);
  88.     if (really != 1) return;
  89.  
  90.     restore_colors();
  91.     gexit();
  92.     exit(0);
  93. }
  94.  
  95.  
  96. menugrid()
  97. {
  98.     qreset();
  99.     switch (dopup(grid_menu)) {
  100.     case 1:
  101.         grid = 13;
  102.         break;
  103.     case 2:
  104.         grid = 17;
  105.         break;
  106.     case 3:
  107.         grid = 21;
  108.     break;
  109.     }
  110.     
  111. }
  112.  
  113. menuspeed()
  114. {
  115.     qreset();
  116.     switch (dopup(speed_menu)) {
  117.     case 1:
  118.         dt = 0.001;
  119.         break;
  120.     case 2:
  121.         dt = 0.004;
  122.         break;
  123.     case 3:
  124.         dt = 0.008;
  125.     break;
  126.     }
  127.     
  128. }
  129.  
  130.  
  131. selectmode()
  132. {
  133.     smode=TRUE;
  134.     sphi=0; stheta=450;
  135.     nmx=getvaluator(MOUSEX); nmy=getvaluator(MOUSEY);
  136.     omx=nmx; omy=nmy;
  137.     spin=TRUE; spin_scene(); spin=getbutton(MOUSE2);
  138.     near=1.0; far=40.0; fixwindow();
  139.  
  140.     if (antialias) {
  141.     smoothline(TRUE);
  142.     zbuffer(TRUE);
  143.     zsource(ZSRC_COLOR);
  144.     zfunction(ZF_GEQUAL);
  145.     } else {
  146.     smoothline(FALSE);
  147.     zfunction(ZF_LEQUAL);
  148.     zsource(ZSRC_DEPTH);
  149.     }
  150. }
  151.  
  152. go()
  153. {
  154.     switch (dmode) {
  155.     case NORMAL:
  156.         normal_mode();
  157.         break;
  158.     case DEPTHCUED:
  159.         depthcued_mode();
  160.         break;
  161.     case FLAT_SHADED:
  162.         flat_shaded_mode();
  163.         break;
  164.     case GOURAUD_SHADED:
  165.         gouraud_shaded_mode();
  166.     break;
  167.     case TOPVIEW:
  168.         top_mode();
  169.         break;
  170.     default:
  171.         break;
  172.     }
  173. }
  174.  
  175. reverse()
  176. {
  177.     int i,j;
  178.  
  179.     for(i=1;i<(grid-1);i++)
  180.     for(j=1;j<(grid-1);j++)
  181.         veloc[i][j]= -veloc[i][j];
  182.     while(getbutton(MOUSE3)) i=1;
  183. }
  184.  
  185. resetpoints()
  186. {
  187.     int i,j;
  188.     for(i=0;i<grid;i++)
  189.     for(j=0;j<grid;j++)
  190.     {
  191.         force[i][j]=0.0;
  192.         veloc[i][j]=0.0;
  193.         posit[i][j]=0.0;
  194.         vertvec[i][j][X]=0.0;
  195.         vertvec[i][j][Y]=0.0;
  196.         vertvec[i][j][Z]=0.0;
  197.         colur[i][j]=0;
  198.     }
  199. }
  200.  
  201. normal_mode() {
  202.     dmode = NORMAL;
  203.     depthcue(FALSE);
  204.     near=1.0; far=40.0; fixwindow();
  205.     smode=FALSE;
  206.  
  207.     if (antialias) {
  208.     smoothline(TRUE);
  209.     zbuffer(TRUE);
  210.     zsource(ZSRC_COLOR);
  211.     zfunction(ZF_GEQUAL);
  212.     } else {
  213.     smoothline(FALSE);
  214.     zfunction(ZF_LEQUAL);
  215.     zsource(ZSRC_DEPTH);
  216.     }
  217. }
  218.  
  219. depthcued_mode() {
  220.     dmode = DEPTHCUED;
  221.     depthcue(TRUE);
  222.     near=grid/2.0; far=grid*2.0; fixwindow();
  223.     smode=FALSE;
  224.  
  225.     if (antialias) {
  226.     lshaderange(SRAMP, SRAMP+ 32*16, 0x00, 0x7fffff);
  227.     smoothline(TRUE);
  228.     zbuffer(TRUE);
  229.     zsource(ZSRC_COLOR);
  230.     zfunction(ZF_GEQUAL);
  231.     } else {
  232.     lshaderange(DRAMPB,DRAMPE, 0x00, 0x7fffff);
  233.     smoothline(FALSE);
  234.     zfunction(ZF_LEQUAL);
  235.     zsource(ZSRC_DEPTH);
  236.     }
  237. }
  238.  
  239. flat_shaded_mode() {
  240.     dmode = FLAT_SHADED;
  241.     depthcue(FALSE);
  242.     near=1.0; far=40.0; fixwindow();
  243.     smode=FALSE;
  244.     smoothline(FALSE);
  245.     zfunction(ZF_LEQUAL);
  246.     zsource(ZSRC_DEPTH);
  247. }
  248.  
  249. gouraud_shaded_mode() {
  250.     dmode = GOURAUD_SHADED;
  251.     depthcue(FALSE);
  252.     near=1.0; far=40.0; fixwindow();
  253.     smode=FALSE;
  254.     smoothline(FALSE);
  255.     zfunction(ZF_LEQUAL);
  256.     zsource(ZSRC_DEPTH);
  257. }
  258.  
  259. top_mode() {
  260.     sphi= 150; stheta=0;
  261.     near = 13.0; far = 27.0; fixwindow();
  262.     dmode = TOPVIEW;
  263.     depthcue(TRUE);
  264.     lshaderange(CRAMPB, CRAMPB+65, 0x00, 0x7fffff);
  265.     smode=FALSE;
  266.     smoothline(FALSE);
  267.     zfunction(ZF_LEQUAL);
  268.     zsource(ZSRC_DEPTH);
  269. }
  270.  
  271. antialias_mode() {
  272.     antialias = !antialias;
  273.  
  274.     if (smode) {
  275.  
  276.     selectmode();
  277.  
  278.     } else switch(dmode) {
  279.  
  280.     case DEPTHCUED:
  281.         depthcued_mode();
  282.         break;
  283.  
  284.     case NORMAL:
  285.         normal_mode();
  286.         break;
  287.     }
  288. }
  289.  
  290.  
  291. long gid;
  292.  
  293.  
  294. main (argc, argv)
  295. int    argc;
  296. char    *argv[];
  297. {
  298.     Colorindex c;
  299.     int i;
  300.     int r=100, g=255, b=255;
  301.  
  302.     sdepth = 5.0/4.0 * grid;
  303.  
  304.     {
  305.         char *t, *strrchr();
  306.         if (getgdesc(GD_BITS_NORM_SNG_RED) == 0)
  307.         {
  308.             system("inform 'Your system must support RGB mode to run newave'");
  309.                 exit(1);
  310.         }
  311.         if (getgdesc(GD_BITS_NORM_DBL_CMODE) < 12) {
  312.             system("inform 'Your system must support 890 color entries to run newave'");
  313.             exit(1);
  314.         }
  315.         if (getgdesc(GD_BITS_NORM_ZBUFFER) == 0)
  316.         {
  317.              system("inform 'Your system must have a z-buffer to run newave'");
  318.              exit(1);
  319.         }
  320.         gid=winopen((t=strrchr(argv[0], '/')) != NULL ? t+1 : argv[0]);
  321.     }
  322.  
  323.     save_colors();
  324.  
  325.     getlightvector();
  326.  
  327.     /* regular */
  328.     makerange(NRAMPB,NRAMPE-25,0,200,0,50,30,255);
  329.     makerange(NRAMPE-24,NRAMPE,200, 255, 50, 255, 255, 255);
  330.  
  331.     makerange(DRAMPB, DRAMPE,0,50,50,255,50,200);
  332.  
  333.     /* rainbow */
  334.     makerange(CRAMPB, CRAMPB+5, 255, 255, 0, 255, 0, 0);
  335.     makerange(CRAMPB+6, CRAMPB+11, 255, 0, 255, 255, 0, 0);
  336.     makerange(CRAMPB+12, CRAMPB+17, 0, 0, 255, 255, 0, 255);
  337.     makerange(CRAMPB+18, CRAMPB+23, 0, 0, 255, 0, 255, 255);
  338.     makerange(CRAMPB+24, CRAMPB+29, 0, 255, 0, 0, 255, 255);
  339.     makerange(CRAMPB+30, CRAMPB+35, 255, 255, 0, 0, 255, 0);
  340.     makerange(CRAMPB+36, CRAMPB+41, 255, 255, 0, 255, 0, 0);
  341.     makerange(CRAMPB+42, CRAMPB+47, 255, 0, 255, 255, 0, 0);
  342.     makerange(CRAMPB+48, CRAMPB+53, 0, 0, 255, 255, 0, 255);
  343.     makerange(CRAMPB+54, CRAMPB+58, 0, 0, 255, 0, 255, 255);
  344.     makerange(CRAMPB+59, CRAMPB+63, 0, 255, 0, 0, 255, 255);
  345.     /* lsetdepth(0x00, 0x7fffff); */
  346.     lsetdepth(0x00,(getgdesc(GD_ZMAX)));
  347.     zbuffer(TRUE);
  348.  
  349.     for (i=0; i<32; i++) {
  350.     
  351.         makerange (SRAMP + i*16, SRAMP + i*16 + 15,
  352.             0, r*i/31,
  353.             0, g*i/31,
  354.             0, b*i/31);
  355.     }
  356.     makerange (MYRED, MYRED+16, 0, 255, 0, 0, 0, 0);
  357.     makerange (MYGREEN, MYGREEN+16, 0, 0, 0, 255, 0, 0);
  358.     makerange (MYCYAN, MYCYAN+16, 0, 0, 0, 255, 0, 255);
  359.  
  360.  
  361.     killmenu = defpup("Really? %t|yes|no");
  362.  
  363. display_menu = defpup("Display Type %t|normal %f|depthcued %f|flat shaded %f|gouraud shaded %f|top view %f|antialias %f", normal_mode, depthcued_mode, flat_shaded_mode, gouraud_shaded_mode, top_mode, antialias_mode );
  364.  
  365. speed_menu = defpup("Speed %t|weak|medium|strong");
  366. grid_menu = defpup("Grid Size %t|small|medium|large");
  367.  
  368. menu=defpup("WAVE %t|edit|go|reverse|display menu|spring menu|grid menu|reset|kill");
  369.  
  370.     doublebuffer();
  371.     gconfig();    
  372.     color(BLACK);
  373.     clear(); swapbuffers(); clear();
  374.     color(CYAN);
  375. /*    shaderange(20,50,0,40);    */
  376.     reshapeviewport();
  377.     fixwindow();
  378.     resetpoints();
  379.     qdevice(UPARROWKEY);
  380.     qdevice(DOWNARROWKEY);
  381.     qdevice(INPUTCHANGE);
  382.     qdevice(REDRAW);
  383.     qdevice(ESCKEY);
  384.     qdevice(WINQUIT);
  385.     qdevice(WINSHUT);
  386.     qdevice(RIGHTMOUSE);
  387.     qdevice(LEFTMOUSE);
  388.     qdevice(MIDDLEMOUSE);
  389.     tie (MIDDLEMOUSE, MOUSEX, MOUSEY);
  390.     tie (LEFTMOUSE, MOUSEX, MOUSEY);
  391.  
  392.     while(TRUE) {
  393.  
  394.         while(qtest()) {
  395.             dev=qread(&val);
  396.             switch(dev) {
  397.                 case ESCKEY :    /* Ignore ESC up */
  398.                     if (val) break;
  399.                 case WINQUIT :    /* ESC down or exiting... */
  400.                     restore_colors();
  401.                     gexit();
  402.                     exit(0);
  403.                     break;
  404.                 case INPUTCHANGE :
  405.                     attached=val;
  406.                     break;
  407.                 case REDRAW :
  408.                     reshapeviewport();
  409.                     fixwindow();
  410.                     break;
  411.                 case RIGHTMOUSE :
  412.                     if (val)
  413.                         switch(dopup(menu)) {
  414.                         case 1:
  415.                             selectmode();
  416.                             break;
  417.                         case 2:
  418.                             go();
  419.                             break;
  420.                         case 3:
  421.                             reverse();
  422.                             break;
  423.                         case 4:
  424.                             dopup(display_menu);
  425.                             break;
  426.                         case 5:
  427.                             menuspeed();
  428.                             break;
  429.                         case 6:
  430.                             menugrid();
  431.                             break;
  432.                         case 7:
  433.                             resetpoints();
  434.                             break;
  435.                         case 8:
  436.                             menukill();
  437.                             break;
  438.                         }
  439.                     break;
  440.                 case MIDDLEMOUSE :
  441.                     spin = val;
  442.                     omx = nmx; omy = nmy;
  443.                     qread(&nmx); qread(&nmy);
  444.                     if (!spin) {
  445.                         sphi+=(Angle)(nmx-omx);
  446.                         stheta+=(Angle)(omy-nmy);
  447.                         dtheta = 0;
  448.                         dphi = 0;
  449.                     }
  450.                     break;
  451.                 case LEFTMOUSE:
  452.                     qread(&nmx); qread(&nmy);
  453.                     if (editing=val) {
  454.                         setvaluator(MOUSEX, nmx,
  455.                         xorig, xorig+xsize-1);
  456.                         setvaluator(MOUSEY, nmy,
  457.                         yorig, yorig+ysize-1);
  458.                     } else {
  459.                         setvaluator(MOUSEX, nmx,
  460.                         0, getgdesc(GD_XPMAX));
  461.                         setvaluator(MOUSEY, nmy,
  462.                         0, getgdesc(GD_YPMAX));
  463.                     }
  464.                     break;
  465.             }
  466.         }
  467.         viewit();
  468.         if(smode) {
  469.             depthcue(FALSE);
  470.             doscreen();
  471.         } else {
  472.             switch (dmode) {
  473.             case NORMAL:
  474.             doscreen();
  475.                 break;
  476.             case DEPTHCUED:
  477.             depthcue(TRUE);
  478.             doscreen();
  479.                 break;
  480.             case FLAT_SHADED:
  481.                 facet_shade();
  482.                 break;
  483.             case GOURAUD_SHADED:
  484.             gouraud_shade();
  485.             break;
  486.             case TOPVIEW:
  487.             depthcue(TRUE);
  488.             doscreen();
  489.                 break;
  490.             default:
  491.                 break;
  492.             }
  493.             
  494.         }
  495.  
  496.         if (!smode) {
  497.             getforce();
  498.             getvelocity();
  499.             getposition();
  500.         }
  501.  
  502.         spin_scene();
  503.  
  504.  
  505.     }
  506. }
  507.  
  508.  
  509. getforce()
  510. {
  511.     register int i,j;
  512.     register float d;
  513.  
  514.     for(i=1;i<grid-1;i++) for(j=1;j<grid-1;j++) force[i][j]=0.0;
  515.  
  516.  
  517.     for(i=1;i<(grid+1)/2;i++)
  518.     for(j=1;j<(grid+1)/2;j++) {
  519.  
  520.         d=posit[i][j]-posit[i][j-1];
  521.         force[i][j] -= d;
  522.         force[i][j-1] += d;
  523.  
  524.         d=posit[i][j]-posit[i-1][j];
  525.         force[i][j] -= d;
  526.         force[i-1][j] += d;
  527.  
  528.         d=posit[i][j]-posit[i-1][j-1];
  529.         force[i][j] -= d ;
  530.         force[i-1][j-1] += d;
  531.     }
  532.  
  533.     for(i=(grid+1)/2;i<grid;i++)
  534.     for(j=(grid+1)/2;j<grid;j++) {
  535.  
  536.         d=posit[i][j]-posit[i][j-1];
  537.         force[i][j] -= d;
  538.         force[i][j-1] += d;
  539.  
  540.         d=posit[i][j]-posit[i-1][j];
  541.         force[i][j] -= d;
  542.         force[i-1][j] += d;
  543.  
  544.         d=posit[i][j]-posit[i-1][j-1];
  545.         force[i][j] -= d ;
  546.         force[i-1][j-1] += d;
  547.     }
  548.  
  549.     for(i=(grid+1)/2;i<grid;i++)
  550.     for(j=i-(grid+1)/2+1;j<(grid+1)/2;j++) {
  551.  
  552.         d=posit[i][j]-posit[i][j-1];
  553.         force[i][j] -= d;
  554.         force[i][j-1] += d;
  555.  
  556.         d=posit[i][j]-posit[i-1][j];
  557.         force[i][j] -= d;
  558.         force[i-1][j] += d;
  559.  
  560.         d=posit[i][j]-posit[i-1][j-1];
  561.         force[i][j] -= d ;
  562.         force[i-1][j-1] += d;
  563.     }
  564.  
  565.     for(i=1;i<(grid+1)/2;i++)
  566.     for(j=(grid+1)/2;j<i+(grid+1)/2;j++) {
  567.  
  568.         d=posit[i][j]-posit[i][j-1];
  569.         force[i][j] -= d;
  570.         force[i][j-1] += d;
  571.  
  572.         d=posit[i][j]-posit[i-1][j];
  573.         force[i][j] -= d;
  574.         force[i-1][j] += d;
  575.  
  576.         d=posit[i][j]-posit[i-1][j-1];
  577.         force[i][j] -= d ;
  578.         force[i-1][j-1] += d;            
  579.  
  580.     }
  581. }
  582.  
  583.  
  584. getvelocity()
  585. {
  586.     register int i,j;
  587.     register float d;
  588.  
  589.     for(i=1;i<(grid+1)/2;i++)
  590.     for(j=1;j<(grid+1)/2;j++)
  591.         veloc[i][j]+=force[i][j] * dt;
  592.  
  593.     for(i=(grid+1)/2;i<grid-1;i++)
  594.     for(j=(grid+1)/2;j<grid-1;j++)
  595.         veloc[i][j]+=force[i][j] * dt;
  596.  
  597.     for(i=(grid+1)/2;i<grid-1;i++)
  598.     for(j=i-(grid+1)/2+2;j<(grid+1)/2;j++)
  599.         veloc[i][j]+=force[i][j] * dt;
  600.  
  601.     for(i=2;i<(grid+1)/2;i++)
  602.     for(j=(grid+1)/2;j<i+(grid+1)/2-1;j++)
  603.         veloc[i][j]+=force[i][j] * dt;
  604.         
  605. }
  606.  
  607. getposition()
  608. {
  609.     register int i,j;
  610.     register float d;
  611.  
  612.     for(i=1;i<(grid+1)/2;i++)
  613.     for(j=1;j<(grid+1)/2;j++)
  614.         posit[i][j]+=veloc[i][j];
  615.  
  616.     for(i=(grid+1)/2;i<grid-1;i++)
  617.     for(j=(grid+1)/2;j<grid-1;j++)
  618.         posit[i][j]+=veloc[i][j];
  619.  
  620.     for(i=(grid+1)/2;i<grid-1;i++)
  621.     for(j=i-(grid+1)/2+2;j<(grid+1)/2;j++)
  622.         posit[i][j]+=veloc[i][j];
  623.  
  624.     for(i=2;i<(grid+1)/2;i++)
  625.     for(j=(grid+1)/2;j<i+(grid+1)/2-1;j++)
  626.         posit[i][j]+=veloc[i][j];
  627. }
  628.  
  629.  
  630. getvertvec()
  631. {
  632.     register int i,j;
  633.     register float d;
  634.  
  635.     for(i=0;i<grid;i++) for(j=0;j<grid;j++) {
  636.         vertvec[i][j][X] = 0.0;
  637.         vertvec[i][j][Y] = 0.0;
  638.         vertvec[i][j][Z] = 0.0;
  639.         colur[i][j] = 0.0;
  640.     }
  641.  
  642.     for(i=1;i<(grid+1)/2;i++)
  643.     for(j=1;j<(grid+1)/2;j++) {
  644.  
  645.         do_vertvec(i, j);
  646.     }
  647.  
  648.     for(i=(grid+1)/2;i<grid;i++)
  649.     for(j=(grid+1)/2;j<grid;j++) {
  650.         do_vertvec(i, j);
  651.  
  652.     }
  653.  
  654.     for(i=(grid+1)/2;i<grid;i++)
  655.     for(j=i-(grid+1)/2+1;j<(grid+1)/2;j++) {
  656.         do_vertvec(i, j);
  657.  
  658.     }
  659.  
  660.     for(i=1;i<(grid+1)/2;i++)
  661.     for(j=(grid+1)/2;j<i+(grid+1)/2;j++) {
  662.         do_vertvec(i, j);
  663.     }
  664. }
  665.  
  666.  
  667. doscreen()
  668. {
  669.  
  670.     register int i,j;
  671.  
  672.     rotate(-450, 'z');
  673.     scale(1.732051, 1.0, 1.0);
  674.     rotate(450, 'z');
  675.  
  676.     for(i=1;i<(grid+1)/2;i++)
  677.     for(j=1;j<(grid+1)/2;j++)
  678.     {
  679.         move( (Coord) i, (Coord) j-1, (Coord) posit[i][j-1]);
  680.         draw( (Coord) i, (Coord) j, (Coord) posit[i][j]);
  681.         draw( (Coord) i-1, (Coord) j, (Coord) posit[i-1][j]);
  682.         move( (Coord) i, (Coord) j, (Coord) posit[i][j]);
  683.         draw( (Coord) i-1, (Coord) j-1, (Coord) posit[i-1][j-1]);
  684.     }
  685.  
  686.     for(i=(grid+1)/2;i<grid;i++)
  687.     for(j=(grid+1)/2;j<grid;j++) {
  688.         move( (Coord) i, (Coord) j-1, (Coord) posit[i][j-1]);
  689.         draw( (Coord) i, (Coord) j, (Coord) posit[i][j]);
  690.         draw( (Coord) i-1, (Coord) j, (Coord) posit[i-1][j]);
  691.         move( (Coord) i, (Coord) j, (Coord) posit[i][j]);
  692.         draw( (Coord) i-1, (Coord) j-1, (Coord) posit[i-1][j-1]);
  693.     }
  694.  
  695.     for(i=(grid+1)/2;i<grid-1;i++)
  696.     for(j=i-(grid+1)/2+2;j<(grid+1)/2;j++) {
  697.         move( (Coord) i, (Coord) j-1, (Coord) posit[i][j-1]);
  698.         draw( (Coord) i, (Coord) j, (Coord) posit[i][j]);
  699.         draw( (Coord) i-1, (Coord) j, (Coord) posit[i-1][j]);
  700.         move( (Coord) i, (Coord) j, (Coord) posit[i][j]);
  701.         draw( (Coord) i-1, (Coord) j-1, (Coord) posit[i-1][j-1]);
  702.     }
  703.  
  704.     for(i=2;i<(grid+1)/2;i++)
  705.     for(j=(grid+1)/2;j<i+(grid+1)/2-1;j++) {
  706.         move( (Coord) i, (Coord) j-1, (Coord) posit[i][j-1]);
  707.         draw( (Coord) i, (Coord) j, (Coord) posit[i][j]);
  708.         draw( (Coord) i-1, (Coord) j, (Coord) posit[i-1][j]);
  709.         move( (Coord) i, (Coord) j, (Coord) posit[i][j]);
  710.         draw( (Coord) i-1, (Coord) j-1, (Coord) posit[i-1][j-1]);
  711.     }
  712.  
  713.     for(i=(grid+1)/2-1;i<grid-1;i++) {
  714.         move( (Coord) i, (Coord) i-(grid+1)/2+2, (Coord) posit[i][i-(grid+1)/2+2]);
  715.         draw( (Coord) (i+1), (Coord) (i-(grid+1)/2+2), 0.0);
  716.     }
  717.     
  718.     for(i=1;i<(grid+1)/2;i++) {
  719.         move( (Coord) i, (Coord) (i+(grid+1)/2-2), (Coord)posit[i][i+(grid+1)/2-2]);
  720.         draw( (Coord) i, (Coord) (i+(grid+1)/2-1), 0.0);
  721.     }
  722.     
  723.  
  724.     move((float)((grid+1)/2-1), (float)(grid-1), 0.0);
  725.     draw(0.0, (float)((grid+1)/2-1), 0.0);
  726.     draw(0.0, 0.0, 0.0);
  727.     draw((float)((grid+1)/2-1), 0.0, 0.0);
  728.     draw((float)(grid-1), (float)((grid+1)/2-1), 0.0);
  729.  
  730.     if (smode) select_point();
  731.     
  732.     swapbuffers();
  733.     if (antialias && (dmode!=TOPVIEW)) {
  734.         czclear(0, 0);
  735.         if (smode) color(MYRED); else color(MYCYAN);
  736.     } else {
  737.         color(BLACK); clear(); zclear();
  738.         if (smode) color(RED); else color(CYAN);
  739.     }
  740.  
  741. }
  742.  
  743.  
  744. facet_shade() {
  745.     int i, j, c;
  746.     Coord triangle[3][3];
  747.  
  748.     rotate(-450, 'z');
  749.     scale(1.732051, 1.0, 1.0);
  750.     rotate(450, 'z');
  751.  
  752.     for (j=grid-1;j>(grid+1)/2-1;j--) {
  753.  
  754.         for (i=(j-((grid+1)/2-1));i<grid-1;i++) {
  755.         triangle[0][0] = (Coord) (i+1);
  756.         triangle[0][1] = (Coord) j;
  757.         triangle[0][2] = (Coord) posit[i+1][j];
  758.  
  759.         triangle[1][0] = (Coord) i;
  760.         triangle[1][1] = (Coord) j;
  761.         triangle[1][2] = (Coord) posit[i][j];
  762.  
  763.         triangle[2][0] = (Coord) i;
  764.         triangle[2][1] = (Coord) (j-1);
  765.         triangle[2][2] = (Coord) posit[i][j-1];
  766.  
  767.         color(c=getpolycolor(triangle));
  768.         polf(3, triangle);
  769.         }
  770.  
  771.     for (i=(j-((grid+1)/2-1));i<grid;i++) {
  772.  
  773.         triangle[0][0] = (Coord) i;
  774.         triangle[0][1] = (Coord) j;
  775.         triangle[0][2] = (Coord) posit[i][j];
  776.  
  777.         triangle[1][0] = (Coord) (i-1);
  778.         triangle[1][1] = (Coord) (j-1);
  779.         triangle[1][2] = (Coord) posit[i-1][j-1];
  780.  
  781.         triangle[2][0] = (Coord) i;
  782.         triangle[2][1] = (Coord) (j-1);
  783.         triangle[2][2] = (Coord) posit[i][j-1];
  784.  
  785.         color(getpolycolor2(triangle));
  786.         polf(3, triangle);
  787.     }
  788.     }
  789.  
  790.     for (j=(grid+1)/2-1;j>0;j--) {
  791.  
  792.         for (i=0;i<((grid+1)/2-1+j);i++) {
  793.  
  794.  
  795.         triangle[0][0] = (Coord) (i+1);
  796.         triangle[0][1] = (Coord) j;
  797.         triangle[0][2] = (Coord) posit[i+1][j];
  798.  
  799.         triangle[1][0] = (Coord) i;
  800.         triangle[1][1] = (Coord) j;
  801.         triangle[1][2] = (Coord) posit[i][j];
  802.  
  803.         triangle[2][0] = (Coord) i;
  804.         triangle[2][1] = (Coord) (j-1);
  805.         triangle[2][2] = (Coord) posit[i][j-1];
  806.  
  807.         color(getpolycolor(triangle));
  808.         polf(3, triangle);
  809.         }
  810.  
  811.     for (i=1;i<((grid+1)/2-1+j);i++) {
  812.  
  813.         triangle[0][0] = (Coord) i;
  814.         triangle[0][1] = (Coord) j;
  815.         triangle[0][2] = (Coord) posit[i][j];
  816.  
  817.         triangle[1][0] = (Coord) (i-1);
  818.         triangle[1][1] = (Coord) (j-1);
  819.         triangle[1][2] = (Coord) posit[i-1][j-1];
  820.  
  821.         triangle[2][0] = (Coord) i;
  822.         triangle[2][1] = (Coord) (j-1);
  823.         triangle[2][2] = (Coord) posit[i][j-1];
  824.  
  825.         color(getpolycolor2(triangle));
  826.         polf(3, triangle);
  827.     }
  828.     }
  829.     swapbuffers();
  830.     color(BLACK); clear();
  831.     zclear();
  832. }
  833.  
  834.  
  835. gouraud_shade() {
  836.     int i, j;
  837.     Coord triangle[3][3];
  838.     float c, r;
  839.  
  840.     getvertvec();
  841.  
  842.     for(i=0;i<grid;i++)    for(j=0;j<grid;j++) {
  843.  
  844.     r = sqrt(vertvec[i][j][X] * vertvec[i][j][X] +
  845.          vertvec[i][j][Y] * vertvec[i][j][Y] +
  846.          vertvec[i][j][Z] * vertvec[i][j][Z]);
  847.  
  848.         vertvec[i][j][X] /= r;
  849.         vertvec[i][j][Y] /= r;
  850.         vertvec[i][j][Z] /= r;
  851.  
  852.     c = dot(vertvec[i][j], light);
  853.     if (c<0.0) c=0.0;
  854.  
  855.     c=(((float)(NRAMPE))-((float)(NRAMPE))) * c + ((float)(NRAMPE));
  856.  
  857.     colur[i][j] = c;
  858.  
  859.     }
  860.  
  861.     rotate(-450, 'z');
  862.     scale(1.732051, 1.0, 1.0);
  863.     rotate(450, 'z');
  864.  
  865.  
  866.     for (j=grid-1;j>(grid+1)/2-1;j--) {
  867.  
  868.         for (i=(j-((grid+1)/2-1));i<grid-1;i++) {
  869.  
  870.         color(colur[i+1][j]);
  871.         pmv( (Coord) (i+1), (Coord) j, posit[i+1][j]);
  872.  
  873.         color(colur[i][j]);
  874.         pdr( (Coord) i, (Coord) j, posit[i][j]);
  875.  
  876.         color(colur[i][j-1]);
  877.         pdr( (Coord) i, (Coord) (j-1), posit[i][j-1]);
  878.  
  879.         pclos();
  880.         }
  881.  
  882.     for (i=(j-((grid+1)/2-1));i<grid;i++) {
  883.  
  884.         color(colur[i][j]);
  885.         pmv( (Coord) i, (Coord) j, posit[i][j]);
  886.  
  887.         color(colur[i-1][j-1]);
  888.         pdr( (Coord) (i-1), (Coord) (j-1), posit[i-1][j-1]);
  889.  
  890.         color(colur[i][j-1]);
  891.         pdr( (Coord) i, (Coord) (j-1), posit[i][j-1]);
  892.  
  893.         pclos();
  894.     }
  895.     }
  896.  
  897.     for (j=(grid+1)/2-1;j>0;j--) {
  898.  
  899.         for (i=0;i<((grid+1)/2-1+j);i++) {
  900.  
  901.         color(colur[i+1][j]);
  902.         pmv( (Coord) (i+1), (Coord) j, posit[i+1][j]);
  903.  
  904.         color(colur[i][j]);
  905.         pdr( (Coord) i, (Coord) j, posit[i][j]);
  906.  
  907.         color(colur[i][j-1]);
  908.         pdr( (Coord) i, (Coord) (j-1), posit[i][j-1]);
  909.  
  910.         pclos();
  911.         }
  912.  
  913.     for (i=1;i<((grid+1)/2-1+j);i++) {
  914.  
  915.         color(colur[i][j]);
  916.         pmv( (Coord) i, (Coord) j, posit[i][j]);
  917.  
  918.         color(colur[i-1][j-1]);
  919.         pdr( (Coord) (i-1), (Coord) (j-1), posit[i-1][j-1]);
  920.  
  921.         color(colur[i][j-1]);
  922.         pdr( (Coord) i, (Coord) (j-1), posit[i][j-1]);
  923.  
  924.         pclos();
  925.     }
  926.     }
  927.  
  928.     swapbuffers();
  929.     color(BLACK); clear();
  930.     zclear();
  931. }
  932.  
  933.  
  934. spin_scene()
  935. {
  936.     if (!attached) return;
  937.  
  938.     if (getbutton(UPARROWKEY)) {
  939.         sdepth-=0.1;
  940.         return;
  941.     }
  942.     if (getbutton(DOWNARROWKEY)) {
  943.         sdepth+=0.1;
  944.         return;
  945.     }
  946.     if (spin) {
  947.         dtheta = nmy-getvaluator(MOUSEY);
  948.         dphi = getvaluator(MOUSEX) - nmx;
  949.     }
  950. }
  951.  
  952.  
  953. fixwindow() {
  954.  
  955.     getsize(&xsize, &ysize);
  956.     getorigin(&xorig, &yorig);
  957.     aspect = (float)xsize/(float)ysize;
  958. }
  959.  
  960. select_point()
  961. {
  962.     int mx, my;
  963.  
  964.     mx = getvaluator(MOUSEX);
  965.     my = getvaluator(MOUSEY);
  966.  
  967.     if (!editing) {
  968.     x=(mx-xorig) * (grid-2) / xsize + 1;
  969.     y=(my-yorig) * (grid-2) / ysize + 1;
  970.  
  971.     if((x-y)>(grid+2)/2-2) x -= (x-y)-(grid+2)/2+2;
  972.     if((y-x)>(grid+2)/2-2) y -= (y-x)-(grid+2)/2+2;
  973.             
  974.     } else {
  975.     posit[x][y]= 0.006*(float)((my-yorig+2) * grid / ysize - grid/2);
  976.     }
  977.  
  978.     if ((mx>xorig) && (mx-xorig<xsize) &&
  979.     (my>yorig) && (my-yorig<ysize)) {
  980.  
  981.     depthcue(FALSE);
  982.     if (antialias) color(MYGREEN);
  983.     else color(GREEN);
  984.     move((Coord)(x+1), (Coord)y, (Coord) posit[x+1][y]);
  985.     draw((Coord)x, (Coord)y, (Coord) posit[x][y]);
  986.     draw((Coord)(x-1), (Coord)y, (Coord) posit[x-1][y]);
  987.     move((Coord)x, (Coord)(y-1), (Coord) posit[x][y-1]);
  988.     draw((Coord)x, (Coord)y, (Coord) posit[x][y]);
  989.     draw((Coord)x, (Coord)(y+1), (Coord) posit[x][y+1]);
  990.     move((Coord)(x-1), (Coord)(y-1), (Coord)posit[x-1][y-1]);
  991.     draw((Coord)x, (Coord)y, (Coord) posit[x][y]);
  992.     draw((Coord)(x+1), (Coord)(y+1), (Coord)posit[x+1][y+1]);
  993.     }
  994.  
  995.     if((dmode==DEPTHCUED)||(dmode==TOPVIEW)) depthcue(TRUE);
  996.         
  997. }
  998.  
  999.  
  1000.  
  1001. int getpolycolor(pts)
  1002. float pts[][3];
  1003. {
  1004.     float norm[3]; 
  1005.     float v1[3],v2[3], constant;
  1006.     int i,get;
  1007.     float c;
  1008.  
  1009.     for (i = 0; i < 3; i++) norm[i] = 0.0;
  1010.     i = 0;
  1011.     get = 1;
  1012.     i = 1;
  1013. /*    v1[0] = pts[1][0] - pts[0][0];
  1014.     v1[1] = pts[1][1] - pts[0][1];
  1015.     v1[2] = pts[1][2] - pts[0][2];
  1016. */
  1017.  
  1018.     v1[0] = -0.965926;
  1019.     v1[1] = 0.258819;
  1020.     v1[2] = (pts[1][2] - pts[0][2]) * 200.0;
  1021.  
  1022. /*
  1023.         v2[0] = pts[2][0] - pts[0][0];
  1024.         v2[1] = pts[2][1] - pts[0][1];
  1025.         v2[2] = pts[2][2] - pts[0][2];
  1026. */
  1027.     v2[0] = -0.707107;
  1028.     v2[1] = -0.707107;
  1029.     v2[2] = (pts[2][2] - pts[0][2]) * 200.0;
  1030.  
  1031.         norm[0] = v1[1] * v2[2] - v1[2] * v2[1];
  1032.         norm[1] = v1[2] * v2[0] - v1[0] * v2[2];
  1033.         norm[2] = v1[0] * v2[1] - v1[1] * v2[0];
  1034.  
  1035.     constant = sqrt((norm[0] * norm[0]) +
  1036.      (norm[1] * norm[1]) + (norm[2] * norm[2]));
  1037.     norm[0] /= constant;
  1038.     norm[1] /= constant;
  1039.     norm[2] /= constant;
  1040.  
  1041.     c = dot(norm,light);
  1042.     if (c<0.0) c=0.0;
  1043.  
  1044.     c = (((float)(NRAMPE)) - ((float)(NRAMPE))) * c + (((float)(NRAMPE)));
  1045.  
  1046.     return((int)c);
  1047. }
  1048.  
  1049.  
  1050. int getpolycolor2(pts)
  1051. float pts[][3];
  1052. {
  1053.     float norm[3];
  1054.     float v1[3],v2[3], constant;
  1055.     int i,get;
  1056.     float c;
  1057.  
  1058.     for (i = 0; i < 3; i++) norm[i] = 0.0;
  1059.     i = 0;
  1060.     get = 1;
  1061.     i = 1;
  1062. /*    v1[0] = pts[1][0] - pts[0][0];
  1063.     v1[1] = pts[1][1] - pts[0][1];
  1064.     v1[2] = pts[1][2] - pts[0][2];
  1065. */
  1066.  
  1067.     v1[0] = -0.707107;
  1068.     v1[1] = -0.707107;
  1069.     v1[2] = (pts[1][2] - pts[0][2]) * 200.0;
  1070.  
  1071. /*
  1072.         v2[0] = pts[2][0] - pts[0][0];
  1073.         v2[1] = pts[2][1] - pts[0][1];
  1074.         v2[2] = pts[2][2] - pts[0][2];
  1075. */
  1076.     v2[0] = 0.258819;
  1077.     v2[1] = -0.965926;
  1078.     v2[2] = (pts[2][2] - pts[0][2]) * 200.0;
  1079.  
  1080.         norm[0] = v1[1] * v2[2] - v1[2] * v2[1];
  1081.         norm[1] = v1[2] * v2[0] - v1[0] * v2[2];
  1082.         norm[2] = v1[0] * v2[1] - v1[1] * v2[0];
  1083.  
  1084.     constant = sqrt((norm[0] * norm[0]) +
  1085.             (norm[1] * norm[1]) +
  1086.             (norm[2] * norm[2]));
  1087.     norm[0] /= constant;
  1088.     norm[1] /= constant;
  1089.     norm[2] /= constant;
  1090.  
  1091.     c = dot(norm,light);
  1092.     if (c<0.0) c=0.0;
  1093.  
  1094.     c = (((float)(NRAMPE))-((float)(NRAMPE))) * c + ((float)(NRAMPE));
  1095.  
  1096.     return(c);
  1097. }
  1098.  
  1099. float dot(vec1,vec2)
  1100. float vec1[3],vec2[3];
  1101. {
  1102.     float xx;
  1103.     xx = (vec1[1] * vec2[1])
  1104.        + (vec1[2] * vec2[2])
  1105.        + (vec1[0] * vec2[0]);
  1106.     return((float) xx);
  1107. }
  1108.  
  1109. getlightvector() {
  1110.     float f;
  1111.     light[2]= cos(theta);
  1112.     f = sin(theta);
  1113.     light[1] = -sin(phi) * f;
  1114.     light[0] = -cos(phi) * f;
  1115. }
  1116.  
  1117. makerange(a,b,r1,r2,g1,g2,b1,b2)
  1118. int a,b;
  1119. int r1,r2,g1,g2,b1,b2;
  1120. {
  1121.     float i;
  1122.     int j;
  1123.     float dr,dg,db;
  1124.  
  1125.     i = (float)(b-a);
  1126.     dr = (float)(r2-r1)/i;
  1127.     dg = (float)(g2-g1)/i;
  1128.     db = (float)(b2-b1)/i;
  1129.  
  1130.     for (j=0;j<=(int)i;j++)
  1131.         mapcolor((Colorindex)j+a,
  1132.              (RGBvalue) (dr * (float)j + r1),
  1133.              (RGBvalue) (dg * (float)j + g1),
  1134.              (RGBvalue) (db * (float)j + b1));
  1135. }
  1136.  
  1137.  
  1138. save_colors() {
  1139.  
  1140.     Colorindex i;
  1141.  
  1142.     for (i=0; i<1024; i++)
  1143.        getmcolor(i, &oldcolors[i][0], &oldcolors[i][1], &oldcolors[i][2]);
  1144. }
  1145.  
  1146. restore_colors() {
  1147.  
  1148.     Colorindex i;
  1149.  
  1150.     for (i=0; i<1024; i++)
  1151.        mapcolor(i, oldcolors[i][0], oldcolors[i][1], oldcolors[i][2]);
  1152. }
  1153.  
  1154.  
  1155.  
  1156. do_vertvec(i, j)
  1157. int i, j;
  1158. {
  1159.     float d;
  1160.  
  1161.     d=posit[i][j]-posit[i][j-1];
  1162.     vertvec[i][j][Z] += 1.0/200.0;
  1163.     vertvec[i][j][X] += d * 0.2558819;
  1164.     vertvec[i][j][Y] += d * -0.965926;
  1165.     vertvec[i][j-1][Z] += 1.0/200.0;
  1166.     vertvec[i][j-1][X] += d * 0.2558819;
  1167.     vertvec[i][j-1][Y] += d * -0.965926;
  1168.  
  1169.     d=posit[i][j]-posit[i-1][j];
  1170.     vertvec[i][j][Z] += 1.0/200.0;
  1171.     vertvec[i][j][X] += d * -0.9659258;
  1172.     vertvec[i][j][Y] += d * 0.258819;
  1173.     vertvec[i-1][j][Z] += 1.0/200.0;
  1174.     vertvec[i-1][j][X] += d * -0.9659258;
  1175.     vertvec[i-1][j][Y] += d * 0.258819;
  1176.  
  1177.     d=posit[i][j]-posit[i-1][j-1];
  1178.     vertvec[i][j][Z] += 1.0/200.0;
  1179.     vertvec[i][j][X] += d * -0.70710678;
  1180.     vertvec[i][j][Y] += d * -0.70710678;
  1181.     vertvec[i-1][j-1][Z] += 1.0/200.0;
  1182.     vertvec[i-1][j-1][X] += d * -0.70710678;
  1183.     vertvec[i-1][j-1][Y] += d * -0.70710678;    
  1184. }
  1185.  
  1186.  
  1187. viewit() {
  1188.     perspective(640, aspect, near, far);
  1189.     translate(0.0,0.0,-sdepth);
  1190.     rotate(-stheta-dtheta,'x');
  1191.     rotate(sphi+dphi,'z');
  1192.     translate(-(float)((grid+1)/2-1), -(float)((grid+1)/2-1), 0.0);
  1193.     scale(1.0, 1.0, 200.0);
  1194. }
  1195.